package com.baizhi.sync3;

/**
 * 静态方法上若使用synchronized,则该方法一定具有同步效果
 * 静态方法上指定的同步监视对象不能是this, 因为静态方法先于对象存在， 又因为同步监视对象必须是所有对象都认识的对象
 * 随意我们使用当前类的类对象
 *
 * 类独享
 * Class类的一个实例，JVM加载一个类的时候就会实例化一个Class的实力，并用于保存加载这个类的相关信息，因此每一个
 * 被加载的类都有钱仅有一个Class的实例与之对应，静态方法的锁对象就是这个实例
 */
public class SyncDemo01 {
    public static void main(String[] args) {

//        Thread t1 = new Thread(()->new Boo().dosome());
//        Thread t2 = new Thread(()->new Boo().dosome());


//        Thread t1 = new Thread(()->new Boo().dosome());
//        Thread t2 = new Thread(()->new Boo().dosome());

        Thread t1 = new Thread(()->Boo.dosome());
        Thread t2 = new Thread(()->Boo.dosome());

        t1.start();
        t2.start();
    }
}


class Boo{
    public static void dosome(){

        /**
         *synchronized() 锁起来的对象得是大家都认识的，
         * Boo.class
         */
        synchronized (Boo.class){
            String name = Thread.currentThread().getName();
            System.out.println(name + "正在执行dosome方法");

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(name + "执行dosome方法完毕");
        }
    }
}
